/**
 * @bsp_debug.c
 *
 * USART1 TX Pin  - PA9
 * USART1 TX Pin  - PA10(not used)
 *
 * @copyright This file create by rensuiyi ,all right reserve!
 *
 * @author rensuiyi
 *
 * @date 20-10-2 下午7:36
 */
#include "bsp_debug.h"

#define BSP_DEBUG_GPIO_PORT        GPIOA
#define BSP_DEBUG_GPIO_PIN         GPIO_Pin_9
#define BSP_DEBUG_UART             USART1

static void bsp_io_register_init(void) {
  GPIO_InitTypeDef init;

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

  GPIO_PinAFConfig(BSP_DEBUG_GPIO_PORT, GPIO_PinSource9, GPIO_AF_USART1);

  GPIO_StructInit(&init);
  init.GPIO_Mode = GPIO_Mode_AF;
  init.GPIO_OType = GPIO_OType_PP;
  init.GPIO_PuPd = GPIO_PuPd_UP;
  init.GPIO_Pin = BSP_DEBUG_GPIO_PIN;
  init.GPIO_Speed = GPIO_Speed_25MHz;

  GPIO_Init(BSP_DEBUG_GPIO_PORT, &init);
}

static void bsp_uart_register_init(void) {
  USART_InitTypeDef uart_init;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  USART_Cmd(BSP_DEBUG_UART, DISABLE);

  USART_StructInit(&uart_init);
  uart_init.USART_BaudRate = 115200;
  uart_init.USART_WordLength = USART_WordLength_8b;
  uart_init.USART_StopBits = USART_StopBits_1;
  uart_init.USART_Parity = USART_Parity_No;
  uart_init.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  uart_init.USART_Mode = USART_Mode_Tx;

  USART_Init(BSP_DEBUG_UART, &uart_init);
  USART_Cmd(BSP_DEBUG_UART, ENABLE);
}

int bsp_debug_port_send_string(const char* pstr, int len) {
  for (int i = 0; i < len;i++) {
    USART_SendData(BSP_DEBUG_UART, pstr[i]);
    while (USART_GetFlagStatus(BSP_DEBUG_UART, USART_FLAG_TC) == RESET) {
    }
  }
  return len;
}

int bsp_debug_init(void) {
  bsp_io_register_init();
  bsp_uart_register_init();

  return 0;
}
